home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / OTHER_LA / 0289.ZIP / LIST.LST < prev    next >
File List  |  1986-11-23  |  6KB  |  123 lines

  1.         *
  2.         -PLUSOPS 1
  3.         *
  4.         *    LIST
  5.         *       This is a Datapoint DOS-style LIST program.  It lists input files,
  6.         *     either text or print files.  It can number output (default), or not.
  7.         *     It generates page headings with page numbers.  Page length can be
  8.         *     specified on the command line.  Tab characters can be expanded to
  9.         *     any desired number of columns.  Output may either write a new or
  10.         *     append to an existing file.  Default is to output to the printer PRN:.
  11.         *    Parameter descriptions for LIST are described in the accompanying
  12.         *     file UTILSDOC.TXT.
  13.         *       The program was written in July 1986 by Gordon E. Peterson II,
  14.         *     P.O. Box 40476, San Antonio, Texas  78229 (U.S.A.).  The program
  15.         *     may be freely distributed.  If you find it to be useful, a five or
  16.         *     ten dollar contribution sent to the author at the above address would
  17.         *     be appreciated.  This will also make it possible to notify you of
  18.         *     periodic improvements to this program;  and to let you know of
  19.         *     some of the many other useful utilities also available.
  20.         *
  21. 1             &FULLSCAN = &TRIM = 1
  22.         *
  23. 2             SCREEN = "LIST 1.00  File Listing Utility" CHAR(13) CHAR(10)
  24. 2       +      "  Copyright 1986, Gordon E. Peterson II" CHAR(13) CHAR(10)
  25.         *
  26.         *  Next define some standard character sets and patterns we will use to
  27.         *  scan off the file names and such on the command line, and to use for
  28.         *  tab character expansion.
  29.         *
  30. 3            ALPHNUM = (ALPHA = &UCASE &LCASE) (DECDIGS = "0123456789")
  31. 4            PATH_CHRS = (PATHCHRS2 = "!#$%&'()*^@_`~{}-" DECDIGS) "."
  32. 5           OB = (WHITE = SPAN(' ' CHAR(9))) | NULL
  33. 6            NAMEPAT = SPAN(ALPHA PATHCHRS2)
  34. 7           INTEGER = SPAN(DECDIGS)
  35. 8            FILENMP = NAMEPAT $ TEMPX *LE(SIZE(TEMPX),8)
  36. 9            FILEXTP2 = (NAMEPAT | NULL) $ TEMPX *LE(SIZE(TEMPX),3)
  37. 10          PATHP = (((ANY(ALPHA) ':') | NULL)
  38. 10      +     ARBNO((SPAN(ALPHA PATH_CHRS) | NULL) "\") SPAN(ALPHA PATH_CHRS)) |
  39. 10      +     (SPAN(ALPHNUM) ":")
  40. 11          OPTSEP = ANY(":=") | NULL
  41. 12            INFPAT = ";" OB PATHP $ FIN ((((OB "," OB) | WHITE)
  42. 12      +     (PATHP . FOUT)) | (NULL . FOUT))
  43. 13            RTCPAT = CHAR(9) @TCPOS
  44.         *
  45.         *  Program Main Code begins here.
  46.         *     First, process the options.
  47.         *
  48. 14            UPARM = REPLACE((&PARM ? ";" REM),&LCASE,&UCASE) " " :F(NOPT)
  49.         *
  50.         *  Get input file name & output file spec if any.
  51.         *
  52. 15            UPARM INFPAT ANY("/ ")
  53. 16            SCREEN = IDENT(FIN) "No valid input file was specified." :S(END)
  54. 17            SCREEN = ~INPUT("INREC",1,150,FIN) "I cannot find input file "
  55. 17      +      FIN :S(END)
  56.         *
  57.         *  Check if we are supposed to write an output file.  If so, and if there
  58.         *  was no output file spec given, we will default the file name to the same
  59.         *  as the name of the input file.
  60.         *
  61. 18            FOUT = ?(UPARM ? "/P") IDENT(FOUT) :F(NODEFONM)
  62. 19            FOUT = ((FIN ? "." FILEXTP2 RPOS(0) = ), FIN)
  63.         *
  64.         *  If an output file was specified but no extension, default the extension
  65.         *  to .LST.
  66.         *
  67. 20      NODEFONM  FOUT FILENMP RPOS(0) = FOUT ".LST"
  68. 21            &FULLSCAN = 0
  69.         *
  70.         *  The following six statements could be trivially reduced to a single
  71.         *  statement but are being left separate for clarity.
  72.         *
  73.         *  Check if we are to suppress line numbers.  (SLNO = NULL if not)
  74.         *
  75. 22            UPARM "/X" . SLNO
  76.         *
  77.         *  Check if number of blanks per tabulation has been specified.     Default to
  78.         *  eight if not.
  79.         *
  80. 23            NBT = 8
  81. 24            UPARM "/T" OPTSEP INTEGER . NBT
  82.         *
  83.         *  Check if number of lines per page has been specified.  Default to 55.
  84.         *
  85. 25            NLP = 55
  86. 26            UPARM "/N" OPTSEP INTEGER . NLP
  87.         *
  88.         *  Check if we are listing an already-formatted file.  (IFAF = NULL if not)
  89.         *
  90. 27            UPARM "/F" . IFAF
  91.         *
  92.         *  Check if appending to disk output file.  Also, if no output file has been
  93.         *  specified, here is where we will default the output to the printer.  Open
  94.         *  the output file and give an error message if we can't.  Exit in that case.
  95.         *
  96. 28            SCREEN = ~OUTPUT("OUTREC",2,"W,131" ( ?(UPARM ? "/Q") ",E",NULL),
  97. 28      +      (FOUT = (DIFFER(FOUT) FOUT, "PRN:")))
  98. 28      +      "Sorry, I cannot open " FOUT " for output." :S(END)
  99.         *
  100.         *  Read an input line
  101.         *
  102. 29      LOOP      LINE = INREC :F(END)
  103. 30             OUTREC = DIFFER(IFAF) LINE :S(LOOP)
  104.         *
  105.         *  Replace any tab characters with blanks as necessary.
  106.         *
  107. 31      TXPLOOP LINE RTCPAT = DUPL(" ",NBT - REMDR(TCPOS - 1,NBT))
  108. 31      +      :S(TXPLOOP)
  109.         *
  110.         *  Output the line as requested.
  111.         *
  112. 32             IDENT(LNO,0) :S(PAGEHDR)
  113. 33             IDENT(REMDR(LNO,NLP),0) :F(OUTIT)
  114. 34      PAGEHDR OUTREC = CHAR(12) CHAR(10) "Page " RPAD((PGNO = PGNO + 1),6)
  115. 34      +        DATE() "    " FIN DUPL(CHAR(10),2)
  116. 35      OUTIT      OUTREC = ?(LNO = LNO + 1) (IDENT(SLNO) LPAD(LNO,6) ". ", NULL)
  117. 35      +      LINE :(LOOP)
  118.         *
  119.         *  Error handling statements
  120.         *
  121. 36      NOPT  SCREEN = "Options must follow the semicolon on the command line." :(END)
  122. 37      END
  123.